'''
请你仅使用两个队列实现一个后入先出（LIFO）的栈，并支持普通栈的全部四种操作（push、top、pop 和 empty）。

实现 MyStack 类：

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的，返回 true ；否则，返回 false 。
 

注意：

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list （列表）或者 deque（双端队列）来模拟一个队列 , 只要是标准的队列操作即可。
 

示例：

输入：
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出：
[null, null, null, 2, 2, false]

解释：
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
'''
class MyStack:
    from collections import deque
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.que1 = deque()
        self.que2 = deque()


    def push(self, x: int) -> None:
        """
        Push element x onto stack.
        """
        self.que1.append(x)


    def pop(self) -> int:
        """
        Removes the element on top of the stack and returns that element.
        """
        size = len(self.que1)
        size -= 1
        while size > 0:
            size -= 1
            self.que2.append(self.que1.popleft())
        result = self.que1.popleft()
        self.que1, self.que2 = self.que2, self.que1
        return result

    def top(self) -> int:
        """
        Get the top element.
        """
        size = len(self.que1)
        size -= 1
        while size > 0:
            size -= 1
            self.que2.append(self.que1.popleft())
        result = self.que1[0]
        self.que2.append(self.que1.popleft())
        self.que1, self.que2 = self.que2, self.que1
        return result


    def empty(self) -> bool:
        """
        Returns whether the stack is empty.
        """
        return self.que1 == deque()



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()